// src/routes/pdf.js
const express = require('express');
const router = express.Router();
const pdfGenerator = require('../utils/pdfGenerator');
const { URL } = require('url');

// 验证URL格式
function isValidUrl(string) {
  try {
    new URL(string);
    return true;
  } catch (_) {
    return false;
  }
}

// 兼容的等待方法
async function waitForTimeout(page, milliseconds) {
  if (page.waitForTimeout) {
    // 新版本的方法
    return page.waitForTimeout(milliseconds);
  } else {
    // 旧版本的方法
    return new Promise(resolve => setTimeout(resolve, milliseconds));
  }
}

// 生成PDF的API端点
router.post('/generate', async (req, res) => {
  try {
    const {
      html,
      template,
      data,
      url,
      filename = 'document.pdf',
      margin = {}, // 支持自定义边距
      ...otherOptions
    } = req.body;

    // 合并边距设置
    const options = {
      ...otherOptions,
      margin: {
        top: margin.top || '5mm',
        right: margin.right || '5mm',
        bottom: margin.bottom || '5mm',
        left: margin.left || '5mm',
        ...margin // 用户自定义的边距会覆盖默认值
      }
    };

    let pdfBuffer;

    if (url) {
      // 从URL生成PDF
      if (!isValidUrl(url)) {
        return res.status(400).json({ error: '无效的URL格式' });
      }
      pdfBuffer = await pdfGenerator.generatePDFFromURL(url, options);
    } else if (html) {
      // 直接从HTML生成
      pdfBuffer = await pdfGenerator.generatePDFFromHTML(html, options);
    } else if (template) {
      // 从模板生成
      pdfBuffer = await pdfGenerator.generatePDFFromTemplate(template, data || {}, options);
    } else {
      return res.status(400).json({
        error: '必须提供 url、html 或 template 参数',
        usage: {
          from_url: { url: 'https://example.com', filename: 'example.pdf' },
          from_html: { html: '<h1>Hello</h1>', filename: 'document.pdf' },
          from_template: { template: 'invoice', data: { name: 'John' } }
        }
      });
    }

    res.setHeader('Content-Type', 'application/pdf');
    res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
    res.send(pdfBuffer);

  } catch (error) {
    console.error('PDF生成错误:', error);
    res.status(500).json({ error: '生成PDF时出错', details: error.message });
  }
});

// 预览PDF
router.post('/preview', async (req, res) => {
  try {
    const { html, template, data, url, options = {} } = req.body;

    let pdfBuffer;

    if (url) {
      if (!isValidUrl(url)) {
        return res.status(400).json({ error: '无效的URL格式' });
      }
      pdfBuffer = await pdfGenerator.generatePDFFromURL(url, options);
    } else if (html) {
      pdfBuffer = await pdfGenerator.generatePDFFromHTML(html, options);
    } else if (template) {
      pdfBuffer = await pdfGenerator.generatePDFFromTemplate(template, data || {}, options);
    } else {
      return res.status(400).json({ error: '必须提供 url、html 或 template 参数' });
    }

    res.setHeader('Content-Type', 'application/pdf');
    res.setHeader('Content-Disposition', 'inline; filename="preview.pdf"');
    res.send(pdfBuffer);

  } catch (error) {
    console.error('PDF预览错误:', error);
    res.status(500).json({ error: '预览PDF时出错', details: error.message });
  }
});

// 获取网页截图（用于预览）
router.post('/screenshot', async (req, res) => {
  try {
    const { url } = req.body;

    if (!url || !isValidUrl(url)) {
      return res.status(400).json({ error: '无效的URL格式' });
    }

    await pdfGenerator.init();
    const page = await pdfGenerator.browser.newPage();

    try {
      await page.goto(url, {
        waitUntil: 'load', // 使用 load 而不是 networkidle0
        timeout: 30000
      });

      // 使用兼容的等待方法
      await waitForTimeout(page, 2000);

      const screenshot = await page.screenshot({
        type: 'jpeg',
        quality: 80,
        fullPage: false
      });

      res.setHeader('Content-Type', 'image/jpeg');
      res.send(screenshot);

    } finally {
      await page.close();
    }

  } catch (error) {
    console.error('截图错误:', error);
    res.status(500).json({ error: '获取截图时出错', details: error.message });
  }
});

// 获取网页信息
router.post('/page-info', async (req, res) => {
  try {
    const { url } = req.body;

    if (!url || !isValidUrl(url)) {
      return res.status(400).json({ error: '无效的URL格式' });
    }

    await pdfGenerator.init();
    const page = await pdfGenerator.browser.newPage();

    try {
      await page.goto(url, {
        waitUntil: 'load', // 使用 load 而不是 networkidle0
        timeout: 30000
      });

      // 使用兼容的等待方法
      await waitForTimeout(page, 1000);

      const pageInfo = await page.evaluate(() => {
        return {
          title: document.title,
          description: document.querySelector('meta[name="description"]')?.content || '',
          url: window.location.href,
          contentLength: document.documentElement.outerHTML.length
        };
      });

      res.json(pageInfo);

    } finally {
      await page.close();
    }

  } catch (error) {
    console.error('获取页面信息错误:', error);
    res.status(500).json({ error: '获取页面信息时出错', details: error.message });
  }
});

// 获取可用的模板列表
router.get('/templates', async (req, res) => {
  try {
    const fs = require('fs').promises;
    const path = require('path');
    const templatesDir = path.join(__dirname, '../templates');

    const files = await fs.readdir(templatesDir);
    const templates = files
        .filter(file => file.endsWith('.html'))
        .map(file => file.replace('.html', ''));

    res.json({ templates });
  } catch (error) {
    res.status(500).json({ error: '获取模板列表失败' });
  }
});

module.exports = router;